import { Logger } from "../../../../../../../extensions/oops-plugin-framework/assets/core/common/log/Logger";
import { RoleNumericDecorator } from "../../../../role/model/attribute/RoleNumericDecorator";
import { RoleAttributeType } from "../../../../role/model/RoleEnum";
import { Role } from "../../../../role/Role";

/** 角色属性修改器 */
export class RoleAttribute {
    /**
     * 附加一个属性值
     * @param role      修改属性角色
     * @param type      属性类型
     * @param value     属性值
     */
    static add(role: Role, type: RoleAttributeType, value: number): RoleNumericDecorator {
        var rnd = new RoleNumericDecorator(type, value);
        role.RoleModel.attributes.addDecorator(rnd);
        Logger.trace(`【属性】【${role.RoleModel.pos}号位：${role.RoleModel.table.name}】添加属性效果，属性为【${type}】值为【${rnd.value}】`);
        return rnd;
    }

    static remove(role: Role, rnd: RoleNumericDecorator) {
        if (rnd && role.RoleModel) {
            Logger.trace(`【属性】【${role.RoleModel.pos}号位：${role.RoleModel.table.name}】消除属性效果，属性为【${rnd.attribute}】值为【${rnd.value}】`);
            role.RoleModel.attributes.removeDecorator(rnd);
        }
    }

    /**
     * 覆盖一个附加属性值
     * @param role      修改属性角色
     * @param type      属性类型
     * @param value     属性值
     */
    static cover(role: Role, type: RoleAttributeType, value: number): RoleNumericDecorator {
        var rn;
        rn = role.RoleModel.attributes.get(type as RoleAttributeType);
        var rnd = new RoleNumericDecorator(type, -rn.value + value);
        role.RoleModel.attributes.addDecorator(rnd);
        Logger.trace(`【属性】【${role.RoleModel.pos}号位：${role.RoleModel.table.name}】覆盖属性效果，属性为【${type}】值为【${rnd.value}】`);
        return rnd;
    }

    /**
     * 原属性 * 百分比
     * @param role      修改属性角色
     * @param type      带转化的属性  如：atk原始数据100
     * @param value     转化比例值    如：value：1.5
     *                             结果：100 + 100*(1.5 - 1) = 150
     */
    static multiplyRatio(role: Role, type: RoleAttributeType, value: number): RoleNumericDecorator {
        var rn;
        rn = role.RoleModel.attributes.get(type as RoleAttributeType);
        var rnd = new RoleNumericDecorator(type, rn.value * (value - 1));
        role.RoleModel.attributes.addDecorator(rnd);
        Logger.trace(` 【${role.RoleModel.uuid}】向【${role.RoleModel.uuid}】释放技能效果，属性为【${type}】值为【${rnd.value}】`);
        return rnd;
    }

    /**
     * 原属性 + 原属性 * 百分比
     * @param role      修改属性角色
     * @param type      带转化的属性  如：atk原始数据100
     * @param value     转化比例值    如：value：1.5
     *                             结果：100 + 100 * 1.5 = 250
     */
    static addRatio(role: Role, type: RoleAttributeType, value: number): RoleNumericDecorator {
        var rn;
        rn = role.RoleModel.attributes.get(type as RoleAttributeType);
        var rnd = new RoleNumericDecorator(type, rn.value * value);
        role.RoleModel.attributes.addDecorator(rnd);
        Logger.trace(` 【${role.RoleModel.uuid}】向【${role.RoleModel.uuid}】释放技能效果，属性为【${type}】值为【${rnd.value}】`);
        return rnd;
    }

    /**
     * 附加从一个属性转换到另外一个属性值
     * @param role      修改属性角色
     * @param from      带转化的属性
     * @param to        附加到的目标属性
     * @param value     转化比例值
     */
    static convert(role: Role, from: RoleAttributeType, to: RoleAttributeType, value: number): RoleNumericDecorator {
        var rn_from
        rn_from = role.RoleModel.attributes.get(from as RoleAttributeType);
        var rnd = new RoleNumericDecorator(to, rn_from.value * value);
        role.RoleModel.attributes.addDecorator(rnd);
        Logger.trace(` 【${role.RoleModel.uuid}】向【${role.RoleModel.uuid}】释放技能效果，属性为【${from}】转为【${to}】值为【${rnd.value}】`);
        return rnd;
    }

    /**
     * 移除所有装饰器属性
     * @param role 
     */
    static removeAll(role: Role){
        role.removeAllDecorators();
    }
}